home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’97 / Finder Dungeon / source code / MoreFiles 1.4.6 / Sources / MoreFiles.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-28  |  16.2 KB  |  602 lines  |  [TEXT/MPS ]

  1. /*
  2. **    Apple Macintosh Developer Technical Support
  3. **
  4. **    The long lost high-level and FSSpec File Manager functions.
  5. **
  6. **    by Jim Luther, Apple Developer Technical Support Emeritus
  7. **
  8. **    File:        MoreFiles.c
  9. **
  10. **    Copyright © 1992-1996 Apple Computer, Inc.
  11. **    All rights reserved.
  12. **
  13. **    You may incorporate this sample code into your applications without
  14. **    restriction, though the sample code has been provided "AS IS" and the
  15. **    responsibility for its operation is 100% yours.  However, what you are
  16. **    not permitted to do is to redistribute the source as "DSC Sample Code"
  17. **    after having made changes. If you're going to re-distribute the source,
  18. **    we require that you make it clear in the source that the code was
  19. **    descended from Apple Sample Code, but that you've made changes.
  20. */
  21.  
  22. #include <Types.h>
  23. #include <Errors.h>
  24. #include <Files.h>
  25.  
  26. #define    __COMPILINGMOREFILES
  27.  
  28. #include "MoreFiles.h"
  29. #include "MoreFilesExtras.h"
  30.  
  31. /*****************************************************************************/
  32.  
  33. pascal    OSErr    HGetVolParms(ConstStr255Param volName,
  34.                              short vRefNum,
  35.                              GetVolParmsInfoBuffer *volParmsInfo,
  36.                              long *infoSize)
  37. {
  38.     HParamBlockRec pb;
  39.     OSErr error;
  40.  
  41.     pb.ioParam.ioNamePtr = (StringPtr)volName;
  42.     pb.ioParam.ioVRefNum = vRefNum;
  43.     pb.ioParam.ioBuffer = (Ptr)volParmsInfo;
  44.     pb.ioParam.ioReqCount = *infoSize;
  45.     error = PBHGetVolParmsSync(&pb);
  46.     *infoSize = pb.ioParam.ioActCount;
  47.     return ( error );
  48. }
  49.  
  50. /*****************************************************************************/
  51.  
  52. pascal    OSErr    HCreateMinimum(short vRefNum,
  53.                                long dirID,
  54.                                ConstStr255Param fileName)
  55. {
  56.     HParamBlockRec pb;
  57.  
  58.     pb.fileParam.ioNamePtr = (StringPtr)fileName;
  59.     pb.fileParam.ioVRefNum = vRefNum;
  60.     pb.ioParam.ioVersNum = 0;
  61.     pb.fileParam.ioDirID = dirID;
  62.     return ( PBHCreateSync(&pb) );
  63. }
  64.  
  65. /*****************************************************************************/
  66.  
  67. pascal    OSErr    FSpCreateMinimum(const FSSpec *spec)
  68. {
  69.     return ( HCreateMinimum(spec->vRefNum, spec->parID, spec->name) );
  70. }
  71.  
  72. /*****************************************************************************/
  73.  
  74. pascal    OSErr    ExchangeFiles(short vRefNum,
  75.                               long srcDirID,
  76.                               ConstStr255Param srcName,
  77.                               long dstDirID,
  78.                               ConstStr255Param dstName)
  79. {
  80.     HParamBlockRec pb;
  81.  
  82.     pb.fidParam.ioVRefNum = vRefNum;
  83.     pb.fidParam.ioSrcDirID = srcDirID;
  84.     pb.fidParam.ioNamePtr = (StringPtr)srcName;
  85.     pb.fidParam.ioDestDirID = dstDirID;
  86.     pb.fidParam.ioDestNamePtr = (StringPtr)dstName;
  87.     return ( PBExchangeFilesSync(&pb) );
  88. }
  89.  
  90. /*****************************************************************************/
  91.  
  92. pascal    OSErr    ResolveFileIDRef(ConstStr255Param volName,
  93.                                  short vRefNum,
  94.                                  long fileID,
  95.                                  long *parID,
  96.                                  StringPtr fileName)
  97. {
  98.     HParamBlockRec pb;
  99.     OSErr error;
  100.     Str255 tempStr;
  101.     
  102.     tempStr[0] = 0;
  103.     if ( volName != NULL )
  104.     {
  105.         BlockMoveData(volName, tempStr, volName[0] + 1);
  106.     }
  107.     pb.fidParam.ioNamePtr = (StringPtr)tempStr;
  108.     pb.fidParam.ioVRefNum = vRefNum;
  109.     pb.fidParam.ioFileID = fileID;
  110.     error = PBResolveFileIDRefSync(&pb);
  111.     *parID = pb.fidParam.ioSrcDirID;
  112.     if ( fileName != NULL )
  113.     {
  114.         BlockMoveData(tempStr, fileName, tempStr[0] + 1);
  115.     }
  116.     return ( error );
  117. }
  118.  
  119. /*****************************************************************************/
  120.  
  121. pascal    OSErr    FSpResolveFileIDRef(ConstStr255Param volName,
  122.                                     short vRefNum,
  123.                                     long fileID,
  124.                                     FSSpec *spec)
  125. {
  126.     OSErr    error;
  127.     
  128.     error = DetermineVRefNum(volName, vRefNum, &(spec->vRefNum));
  129.     if ( error == noErr )
  130.     {
  131.         error = ResolveFileIDRef(volName, vRefNum, fileID, &(spec->parID), spec->name);
  132.     }
  133.     return ( error );
  134. }
  135.  
  136. /*****************************************************************************/
  137.  
  138. pascal    OSErr    CreateFileIDRef(short vRefNum,
  139.                                 long parID,
  140.                                 ConstStr255Param fileName,
  141.                                 long *fileID)
  142. {
  143.     HParamBlockRec pb;
  144.     OSErr error;
  145.  
  146.     pb.fidParam.ioNamePtr = (StringPtr)fileName;
  147.     pb.fidParam.ioVRefNum = vRefNum;
  148.     pb.fidParam.ioSrcDirID = parID;
  149.     error = PBCreateFileIDRefSync(&pb);
  150.     *fileID = pb.fidParam.ioFileID;
  151.     return ( error );
  152. }
  153.  
  154. /*****************************************************************************/
  155.  
  156. pascal    OSErr    FSpCreateFileIDRef(const FSSpec *spec,
  157.                                    long *fileID)
  158. {
  159.     return ( CreateFileIDRef(spec->vRefNum, spec->parID, spec->name, fileID) );
  160. }
  161.  
  162. /*****************************************************************************/
  163.  
  164. pascal    OSErr    DeleteFileIDRef(ConstStr255Param volName,
  165.                                 short vRefNum,
  166.                                 long fileID)
  167. {
  168.     HParamBlockRec pb;
  169.  
  170.     pb.fidParam.ioNamePtr = (StringPtr)volName;
  171.     pb.fidParam.ioVRefNum = vRefNum;
  172.     pb.fidParam.ioFileID = fileID;
  173.     return ( PBDeleteFileIDRefSync(&pb) );
  174. }
  175.  
  176. /*****************************************************************************/
  177.  
  178. pascal    OSErr    FlushFile(short refNum)
  179. {
  180.     ParamBlockRec pb;
  181.  
  182.     pb.ioParam.ioRefNum = refNum;
  183.     return ( PBFlushFileSync(&pb) );
  184. }
  185.  
  186. /*****************************************************************************/
  187.  
  188. pascal    OSErr    LockRange(short refNum,
  189.                           long rangeLength,
  190.                           long rangeStart)
  191. {
  192.     ParamBlockRec pb;
  193.  
  194.     pb.ioParam.ioRefNum = refNum;
  195.     pb.ioParam.ioReqCount = rangeLength;
  196.     pb.ioParam.ioPosMode = fsFromStart;
  197.     pb.ioParam.ioPosOffset = rangeStart;
  198.     return ( PBLockRangeSync(&pb) );
  199. }
  200.  
  201. /*****************************************************************************/
  202.  
  203. pascal    OSErr    UnlockRange(short refNum,
  204.                             long rangeLength,
  205.                             long rangeStart)
  206. {
  207.     ParamBlockRec pb;
  208.  
  209.     pb.ioParam.ioRefNum = refNum;
  210.     pb.ioParam.ioReqCount = rangeLength;
  211.     pb.ioParam.ioPosMode = fsFromStart;
  212.     pb.ioParam.ioPosOffset = rangeStart;
  213.     return ( PBUnlockRangeSync(&pb) );
  214. }
  215.  
  216. /*****************************************************************************/
  217.  
  218. pascal    OSErr    GetForeignPrivs(short vRefNum,
  219.                                 long dirID,
  220.                                 ConstStr255Param name,
  221.                                 void *foreignPrivBuffer,
  222.                                 long *foreignPrivSize,
  223.                                 long *foreignPrivInfo1,
  224.                                 long *foreignPrivInfo2,
  225.                                 long *foreignPrivInfo3,
  226.                                 long *foreignPrivInfo4)
  227. {
  228.     HParamBlockRec pb;
  229.     OSErr error;
  230.  
  231.     pb.foreignPrivParam.ioNamePtr = (StringPtr)name;
  232.     pb.foreignPrivParam.ioVRefNum = vRefNum;
  233.     pb.foreignPrivParam.ioForeignPrivDirID = dirID;    
  234.     pb.foreignPrivParam.ioForeignPrivBuffer = (Ptr)foreignPrivBuffer;
  235.     pb.foreignPrivParam.ioForeignPrivReqCount = *foreignPrivSize;
  236.     error = PBGetForeignPrivsSync(&pb);
  237.     *foreignPrivSize = pb.foreignPrivParam.ioForeignPrivActCount;
  238.     *foreignPrivInfo1 = pb.foreignPrivParam.ioForeignPrivInfo1;
  239.     *foreignPrivInfo2 = pb.foreignPrivParam.ioForeignPrivInfo2;
  240.     *foreignPrivInfo3 = pb.foreignPrivParam.ioForeignPrivInfo3;
  241.     *foreignPrivInfo4 = pb.foreignPrivParam.ioForeignPrivInfo4;
  242.     return ( error );
  243. }
  244.  
  245. /*****************************************************************************/
  246.  
  247. pascal    OSErr    FSpGetForeignPrivs(const FSSpec *spec,
  248.                                    void *foreignPrivBuffer,
  249.                                    long *foreignPrivSize,
  250.                                    long *foreignPrivInfo1,
  251.                                    long *foreignPrivInfo2,
  252.                                    long *foreignPrivInfo3,
  253.                                    long *foreignPrivInfo4)
  254. {
  255.     return ( GetForeignPrivs(spec->vRefNum, spec->parID, spec->name,
  256.                              foreignPrivBuffer, foreignPrivSize,
  257.                              foreignPrivInfo1, foreignPrivInfo2,
  258.                              foreignPrivInfo3, foreignPrivInfo4) );
  259. }
  260.  
  261. /*****************************************************************************/
  262.  
  263. pascal    OSErr    SetForeignPrivs(short vRefNum,
  264.                                 long dirID,
  265.                                 ConstStr255Param name,
  266.                                 const void *foreignPrivBuffer,
  267.                                 long *foreignPrivSize,
  268.                                 long foreignPrivInfo1,
  269.                                 long foreignPrivInfo2,
  270.                                 long foreignPrivInfo3,
  271.                                 long foreignPrivInfo4)
  272. {
  273.     HParamBlockRec pb;
  274.     OSErr error;
  275.  
  276.     pb.foreignPrivParam.ioNamePtr = (StringPtr)name;
  277.     pb.foreignPrivParam.ioVRefNum = vRefNum;
  278.     pb.foreignPrivParam.ioForeignPrivDirID = dirID;    
  279.     pb.foreignPrivParam.ioForeignPrivBuffer = (Ptr)foreignPrivBuffer;
  280.     pb.foreignPrivParam.ioForeignPrivReqCount = *foreignPrivSize;
  281.     pb.foreignPrivParam.ioForeignPrivInfo1 = foreignPrivInfo1;
  282.     pb.foreignPrivParam.ioForeignPrivInfo2 = foreignPrivInfo2;
  283.     pb.foreignPrivParam.ioForeignPrivInfo3 = foreignPrivInfo3;
  284.     pb.foreignPrivParam.ioForeignPrivInfo4 = foreignPrivInfo4;
  285.     error = PBSetForeignPrivsSync(&pb);
  286.     *foreignPrivSize = pb.foreignPrivParam.ioForeignPrivActCount;
  287.     return ( error );
  288. }
  289.  
  290. /*****************************************************************************/
  291.  
  292. pascal    OSErr    FSpSetForeignPrivs(const FSSpec *spec,
  293.                                    const void *foreignPrivBuffer,
  294.                                    long *foreignPrivSize,
  295.                                    long foreignPrivInfo1,
  296.                                    long foreignPrivInfo2,
  297.                                    long foreignPrivInfo3,
  298.                                    long foreignPrivInfo4)
  299. {
  300.     return ( SetForeignPrivs(spec->vRefNum, spec->parID, spec->name,
  301.                              foreignPrivBuffer, foreignPrivSize,
  302.                              foreignPrivInfo1, foreignPrivInfo2,
  303.                              foreignPrivInfo3, foreignPrivInfo4) );
  304. }
  305.  
  306. /*****************************************************************************/
  307.  
  308. pascal    OSErr    HGetLogInInfo(ConstStr255Param volName,
  309.                               short vRefNum,
  310.                               short *loginMethod,
  311.                               StringPtr userName)
  312. {
  313.     HParamBlockRec pb;
  314.     OSErr error;
  315.  
  316.     pb.objParam.ioNamePtr = (StringPtr)volName;
  317.     pb.objParam.ioVRefNum = vRefNum;
  318.     pb.objParam.ioObjNamePtr = userName;
  319.     error = PBHGetLogInInfoSync(&pb);
  320.     *loginMethod = pb.objParam.ioObjType;
  321.     return ( error );
  322. }
  323.  
  324. /*****************************************************************************/
  325.  
  326. pascal    OSErr    HGetDirAccess(short vRefNum,
  327.                               long dirID,
  328.                               ConstStr255Param name,
  329.                               long *ownerID,
  330.                               long *groupID,
  331.                               long *accessRights)
  332. {
  333.     HParamBlockRec pb;
  334.     OSErr error;
  335.  
  336.     pb.accessParam.ioNamePtr = (StringPtr)name;
  337.     pb.accessParam.ioVRefNum = vRefNum;
  338.     pb.fileParam.ioDirID = dirID;
  339.     error = PBHGetDirAccessSync(&pb);
  340.     *ownerID = pb.accessParam.ioACOwnerID;
  341.     *groupID = pb.accessParam.ioACGroupID;
  342.     *accessRights = pb.accessParam.ioACAccess;
  343.     return ( error );
  344. }
  345.  
  346. /*****************************************************************************/
  347.  
  348. pascal    OSErr    FSpGetDirAccess(const FSSpec *spec,
  349.                                 long *ownerID,
  350.                                 long *groupID,
  351.                                 long *accessRights)
  352. {
  353.     return ( HGetDirAccess(spec->vRefNum, spec->parID, spec->name,
  354.                            ownerID, groupID, accessRights) );
  355. }
  356.  
  357. /*****************************************************************************/
  358.  
  359. pascal    OSErr    HSetDirAccess(short vRefNum,
  360.                               long dirID,
  361.                               ConstStr255Param name,
  362.                               long ownerID,
  363.                               long groupID,
  364.                               long accessRights)
  365. {
  366.     HParamBlockRec pb;
  367.  
  368.     pb.accessParam.ioNamePtr = (StringPtr)name;
  369.     pb.accessParam.ioVRefNum = vRefNum;
  370.     pb.fileParam.ioDirID = dirID;
  371.     pb.accessParam.ioACOwnerID = ownerID;
  372.     pb.accessParam.ioACGroupID = groupID;
  373.     pb.accessParam.ioACAccess = accessRights;
  374.     return ( PBHSetDirAccessSync(&pb) );
  375. }
  376.  
  377. /*****************************************************************************/
  378.  
  379. pascal    OSErr    FSpSetDirAccess(const FSSpec *spec,
  380.                                 long ownerID,
  381.                                 long groupID,
  382.                                 long accessRights)
  383. {
  384.     return ( HSetDirAccess(spec->vRefNum, spec->parID, spec->name,
  385.                            ownerID, groupID, accessRights) );
  386. }
  387.  
  388. /*****************************************************************************/
  389.  
  390. pascal    OSErr    HMapID(ConstStr255Param volName,
  391.                        short vRefNum,
  392.                        long ugID,
  393.                        short objType,
  394.                        StringPtr name)
  395. {
  396.     HParamBlockRec pb;
  397.  
  398.     pb.objParam.ioNamePtr = (StringPtr)volName;
  399.     pb.objParam.ioVRefNum = vRefNum;
  400.     pb.objParam.ioObjType = objType;
  401.     pb.objParam.ioObjNamePtr = name;
  402.     pb.objParam.ioObjID = ugID;
  403.     return ( PBHMapIDSync(&pb) );
  404. }
  405.  
  406. /*****************************************************************************/
  407.  
  408. pascal    OSErr    HMapName(ConstStr255Param volName,
  409.                          short vRefNum,
  410.                          ConstStr255Param name,
  411.                          short objType,
  412.                          long *ugID)
  413. {
  414.     HParamBlockRec pb;
  415.     OSErr error;
  416.  
  417.     pb.objParam.ioNamePtr = (StringPtr)volName;
  418.     pb.objParam.ioVRefNum = vRefNum;
  419.     pb.objParam.ioObjType = objType;
  420.     pb.objParam.ioObjNamePtr = (StringPtr)name;
  421.     error = PBHMapNameSync(&pb);
  422.     *ugID = pb.objParam.ioObjID;
  423.     return ( error );
  424. }
  425.  
  426. /*****************************************************************************/
  427.  
  428. pascal    OSErr    HCopyFile(short srcVRefNum,
  429.                           long srcDirID,
  430.                           ConstStr255Param srcName,
  431.                           short dstVRefNum,
  432.                           long dstDirID,
  433.                           ConstStr255Param dstPathname,
  434.                           ConstStr255Param copyName)
  435. {
  436.     HParamBlockRec pb;
  437.  
  438.     pb.copyParam.ioVRefNum = srcVRefNum;
  439.     pb.copyParam.ioDirID = srcDirID;
  440.     pb.copyParam.ioNamePtr = (StringPtr)srcName;
  441.     pb.copyParam.ioDstVRefNum = dstVRefNum;
  442.     pb.copyParam.ioNewDirID = dstDirID;
  443.     pb.copyParam.ioNewName = (StringPtr)dstPathname;
  444.     pb.copyParam.ioCopyName = (StringPtr)copyName;
  445.     return ( PBHCopyFileSync(&pb) );
  446. }
  447.  
  448. /*****************************************************************************/
  449.  
  450. pascal    OSErr    FSpCopyFile(const FSSpec *srcSpec,
  451.                             const FSSpec *dstSpec,
  452.                             ConstStr255Param copyName)
  453. {
  454.     return ( HCopyFile(srcSpec->vRefNum, srcSpec->parID, srcSpec->name,
  455.                        dstSpec->vRefNum, dstSpec->parID,
  456.                        dstSpec->name, copyName) );
  457. }
  458.  
  459. /*****************************************************************************/
  460.  
  461. pascal    OSErr    HMoveRename(short vRefNum,
  462.                             long srcDirID,
  463.                             ConstStr255Param srcName,
  464.                             long dstDirID,
  465.                             ConstStr255Param dstpathName,
  466.                             ConstStr255Param copyName)
  467. {
  468.     HParamBlockRec pb;
  469.  
  470.     pb.copyParam.ioVRefNum = vRefNum;
  471.     pb.copyParam.ioDirID = srcDirID;
  472.     pb.copyParam.ioNamePtr = (StringPtr)srcName;
  473.     pb.copyParam.ioNewDirID = dstDirID;
  474.     pb.copyParam.ioNewName = (StringPtr)dstpathName;
  475.     pb.copyParam.ioCopyName = (StringPtr)copyName;
  476.     return ( PBHMoveRenameSync(&pb) );
  477. }
  478.  
  479. /*****************************************************************************/
  480.  
  481. pascal    OSErr    FSpMoveRename(const FSSpec *srcSpec,
  482.                               const FSSpec *dstSpec,
  483.                               ConstStr255Param copyName)
  484. {
  485.     OSErr    error;
  486.     
  487.     /* make sure the FSSpecs refer to the same volume */
  488.     if ( srcSpec->vRefNum != dstSpec->vRefNum )
  489.     {
  490.         error = diffVolErr;
  491.     }
  492.     else
  493.     {
  494.         error = HMoveRename(srcSpec->vRefNum, srcSpec->parID, srcSpec->name, 
  495.                             dstSpec->parID, dstSpec->name, copyName);
  496.     }
  497.     return ( error );
  498. }
  499.  
  500. /*****************************************************************************/
  501.  
  502. pascal    OSErr    GetVolMountInfoSize(ConstStr255Param volName,
  503.                                     short vRefNum,
  504.                                     short *size)
  505. {
  506.     ParamBlockRec pb;
  507.  
  508.     pb.ioParam.ioNamePtr = (StringPtr)volName;
  509.     pb.ioParam.ioVRefNum = vRefNum;
  510.     pb.ioParam.ioBuffer = (Ptr)size;
  511.     return ( PBGetVolMountInfoSize(&pb) );
  512. }
  513.  
  514. /*****************************************************************************/
  515.  
  516. pascal    OSErr    GetVolMountInfo(ConstStr255Param volName,
  517.                                 short vRefNum,
  518.                                 void *volMountInfo)
  519. {
  520.     ParamBlockRec pb;
  521.  
  522.     pb.ioParam.ioNamePtr = (StringPtr)volName;
  523.     pb.ioParam.ioVRefNum = vRefNum;
  524.     pb.ioParam.ioBuffer = (Ptr)volMountInfo;
  525.     return ( PBGetVolMountInfo(&pb) );
  526. }
  527.  
  528. /*****************************************************************************/
  529.  
  530. pascal    OSErr    VolumeMount(const void *volMountInfo,
  531.                             short *vRefNum)
  532. {
  533.     ParamBlockRec pb;
  534.     OSErr error;
  535.  
  536.     pb.ioParam.ioBuffer = (Ptr)volMountInfo;
  537.     error = PBVolumeMount(&pb);
  538.     *vRefNum = pb.ioParam.ioVRefNum;
  539.     return ( error );
  540. }
  541.  
  542. /*****************************************************************************/
  543.  
  544. pascal    OSErr    Share(short vRefNum,
  545.                       long dirID,
  546.                       ConstStr255Param name)
  547. {
  548.     HParamBlockRec pb;
  549.  
  550.     pb.fileParam.ioNamePtr = (StringPtr)name;
  551.     pb.fileParam.ioVRefNum = vRefNum;
  552.     pb.fileParam.ioDirID = dirID;
  553.     return ( PBShareSync(&pb) );
  554. }
  555.  
  556. /*****************************************************************************/
  557.  
  558. pascal    OSErr    FSpShare(const FSSpec *spec)
  559. {
  560.     return ( Share(spec->vRefNum, spec->parID, spec->name) );
  561. }
  562.  
  563. /*****************************************************************************/
  564.  
  565. pascal    OSErr    Unshare(short vRefNum,
  566.                         long dirID,
  567.                         ConstStr255Param name)
  568. {
  569.     HParamBlockRec pb;
  570.  
  571.     pb.fileParam.ioNamePtr = (StringPtr)name;
  572.     pb.fileParam.ioVRefNum = vRefNum;
  573.     pb.fileParam.ioDirID = dirID;
  574.     return ( PBUnshareSync(&pb) );
  575. }
  576.  
  577. /*****************************************************************************/
  578.  
  579. pascal    OSErr    FSpUnshare(const FSSpec *spec)
  580. {
  581.     return ( Unshare(spec->vRefNum, spec->parID, spec->name) );
  582. }
  583.  
  584. /*****************************************************************************/
  585.  
  586. pascal    OSErr    GetUGEntry(short objType,
  587.                            StringPtr objName,
  588.                            long *objID)
  589. {
  590.     HParamBlockRec pb;
  591.     OSErr error;
  592.  
  593.     pb.objParam.ioObjType = objType;
  594.     pb.objParam.ioObjNamePtr = objName;
  595.     pb.objParam.ioObjID = *objID;
  596.     error = PBGetUGEntrySync(&pb);
  597.     *objID = pb.objParam.ioObjID;
  598.     return ( error );
  599. }
  600.  
  601. /*****************************************************************************/
  602.